package com.sanjin.dubbo.transport;

import java.net.InetSocketAddress;

/**
 * 用来描述client与server建立连接的单个通道，
 * 注意是单个通道，一个client对应一个channel，
 * 而一个server则是对应多个client，也即是多个
 * channel，由于这个差异，故将获取通道的逻辑放在
 * client与server接口中
 *
 * @author: jiangxch
 * @date: 2021/2/16 下午8:07
 */
public interface Channel extends Endpoint{
    
    /**
     * 获取通道对端的地址，对于客户端获取的通道，
     * 该方法获取的即是服务端的地址，对于服务端
     * 获取的通道，该方法获取的即为客户端的地址
     * @return
     */
    InetSocketAddress getRemoteAddress();
    
    /**
     * 通道是否处于连接状态
     * @return
     */
    boolean isConnected();
    
    /**
     * has attribute.
     *
     * @param key key.
     * @return has or has not.
     */
    boolean hasAttribute(String key);
    
    /**
     * get attribute.
     *
     * @param key key.
     * @return value.
     */
    Object getAttribute(String key);
    
    /**
     * set attribute.
     *
     * @param key   key.
     * @param value value.
     */
    void setAttribute(String key, Object value);
    
    /**
     * remove attribute.
     *
     * @param key key.
     */
    void removeAttribute(String key);
}
